﻿// ===============================================================================
// 浪潮GSP平台
// SQL元素类
// 请查看《GSP7-数据访问引擎子系统概要设计说明书》来了解关于此类的更多信息。
// ===============================================================================
// 变更历史纪录
// 时间			             版本	    修改人	        描述
// 2013/1/28 22:38:55        1.0        周国庆         初稿。
// 2013/1/29 09:36:00        1.1        周国庆          基本实现。
// ===============================================================================
// 开发者: 周国庆
// 2013/1/28 22:38:55 
// (C) 2013 Genersoft Corporation 版权所有
// 保留所有权利。
// ===============================================================================

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Xml;
using System.Reflection;

namespace T.FAS.Runtime.DataAccess.SQLDom
{
    /// <summary>
    /// SQL元素类
    /// </summary>
    /// <remarks>SQL语句中的最基本粒度实体类</remarks>
    [Serializable]
    public abstract class SqlElement : ICloneable
    {
        #region 常量       

        #endregion

        #region 字段

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数
        /// </summary>
        public SqlElement()
        {
            //Id = Guid.NewGuid().ToString();
        }

        #endregion

        #region 属性

        /// <summary>
        /// 标识
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// 子结点
        /// </summary>
        private SqlElementCollection childCollection;

        /// <summary>
        /// 子结点。
        /// </summary>
        public virtual SqlElementCollection ChildCollection
        {
            get
            {
                if (childCollection == null)
                    childCollection = new SqlElementCollection();

                return this.childCollection;
            }
        }

        #endregion

        #region 方法

        /// <summary>
        /// 转换成SQL，返回SQL的一部分
        /// </summary>
        /// <returns>转换成的SQL</returns>
        public abstract string ToSQL();

        /// <summary>
        /// 创建子对象集合。
        /// </summary>
        protected void CreateChildCollection()
        {
            this.childCollection = new SqlElementCollection();
        }

        /// <summary>
        /// 检查是否为空串。
        /// </summary>
        /// <param name="variable">输入的字符串。</param>
        /// <returns>是否为空串的bool值。</returns>
        protected static bool IsBlankString(string variable)
        {
            return string.IsNullOrWhiteSpace(variable);
        }

        /// <summary>
        /// 为字符串两边添加单引号。
        /// </summary>
        /// <param name="variable">输入的字符串。</param>
        /// <returns>添加单引号后的字符串</returns>
        protected static string QuotedString(string variable)
        {
            return variable != null ? string.Format("'{0}'", variable) : "NULL";
        }

        /// <summary>
        /// 克隆
        /// </summary>
        /// <returns>Sql元素</returns>
        public virtual object Clone()
        {
            SqlElement newSqlElement = this.MemberwiseClone() as SqlElement;
            if (childCollection != null)
                newSqlElement.childCollection = this.childCollection.Clone() as SqlElementCollection;

            return newSqlElement;
        }
       
        #endregion
    }
}
